/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package managers;

import commande.Command;
import entity.Client;
import entity.Commande;
import entity.ElementCommande;
import entity.EtatCommande;
import entity.Langue;
import entity.Produit;
import java.util.GregorianCalendar;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceContext;
import panier.Cart;
import panier.CartItem;
import session.ClientFacade;
import session.CommandeFacade;
import session.DescriptionFacade;
import session.ElementCommandeFacade;
import session.ProduitFacade;

/**
 *
 * @author livetnediser
 */
@Stateless
public class CommandManager {
    
    @PersistenceContext(unitName = "SexyShopPU")
    private EntityManager em;
    
    @EJB
    ElementCommandeFacade elementCommandeFacade;
    @EJB
    CommandeFacade commandeFacade;
    @EJB
    DescriptionFacade descriptionFacade;
    @EJB
    ProduitFacade produitFacade;
    @EJB
    ClientFacade clientFacade;
    
    public CommandManager(){
        
    }
    
    public Command loadCommand(int idCommand, Langue langue){
       Command c = new Command(); 
       List<ElementCommande> elements = elementCommandeFacade.findByIdCommand(commandeFacade.find(idCommand));
       
       for(ElementCommande e: elements){
           c.addItem(e.getIdProduit(), e.getPrixUnite(), e.getQuantite(), descriptionFacade.findByProductLangue(e.getIdProduit(), langue).getDescriptionBref());
       }
       return c;
    } 
    
    public synchronized boolean doCommand(Cart cart){
       boolean ok = true; 
       
        
        try{
            for(CartItem ci:cart.getItems()){
                Produit p = produitFacade.find(ci.getProduct().getIdproduit());
               
                if((p.getStockActuel() - ci.getQuantity())<0) return false;
            }
            for(CartItem ci:cart.getItems()){
                Produit p = produitFacade.find(ci.getProduct().getIdproduit());
                p.decStockActuel(ci.getQuantity());
                p.setNbVentes(p.getNbVentes()+ci.getQuantity());
                em.merge(p);
            }
        }catch(Exception e){
            return false;
        }
        return true;
    }
    
    public Commande saveCommand(Client cl, Cart ca, String com){
        GregorianCalendar cal = new GregorianCalendar();
        Commande c = new Commande();
        c.setIdclient(cl);
        c.setCommentaire(com);
        c.setDate(cal.getTime());
        c.setTotalCommande(ca.getTotalremise());
        c.setEtatcommande(1);//being packed
        em.persist(c);
        em.flush();
        
        for(CartItem ci: ca.getItems()){
            ElementCommande ec = new ElementCommande();
            ec.setIdCommande(c);
            ec.setIdProduit(ci.getProduct());
            ec.setPrixUnite(Math.rint((ci.getProduct().getPrix()*(100-ci.getProduct().getRemise())*100)/100)/100);
            ec.setQuantite((int) ci.getQuantity());
            em.persist(ec);
        }
        
        Client cn = clientFacade.find(cl.getIdclient());
        cn.setNombreAchats(cn.getNombreAchats()+1);
        cn.setMontantAccumule(cn.getMontantAccumule()+ca.getTotal());
        GregorianCalendar calen = new GregorianCalendar();
        cn.setDateDernierAchat(calen.getTime());
        if(cn.getDatePremierAchat()==null) cn.setDatePremierAchat(calen.getTime());
        em.persist(cn);
        return c;
    }

    public Command loadCommand(Commande cde, Langue langue) {
        Command c = new Command(); 
        List<ElementCommande> elements = elementCommandeFacade.findByIdCommand(cde);
       
        for(ElementCommande e: elements){
           c.addItem(e.getIdProduit(), e.getPrixUnite(), e.getQuantite(), descriptionFacade.findByProductLangue(e.getIdProduit(), langue).getDescriptionBref());
        }
        return c;
    }
    
    public Commande changeState(Commande com, EtatCommande etat){
        com.setEtatcommande(etat.getIdetatCommande());
        em.merge(com);
        return com;
    }
}
